package com.haozhiyan.zhijian.widget;


import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Point;
import android.os.Build;
import android.support.annotation.NonNull;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.Display;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.animation.AnimationUtils;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.haozhiyan.zhijian.R;

import java.util.List;

/**
 * 自定义筛选弹窗
 */
public class DropDownMenu extends LinearLayout {

    //顶部菜单布局
    private LinearLayout tabMenuView;
    //底部容器，包含popupMenuViews，maskView
    private FrameLayout containerView;
    //弹出菜单父布局
    private FrameLayout popupMenuViews;
    //遮罩半透明View，点击可关闭DropDownMenu
    private View maskView;
    //tabMenuView里面选中的tab位置，-1表示未选中
    private int current_tab_position = -1;

    //分割线颜色
    private int dividerColor = 0xffcccccc;
    //tab选中颜色
    private int textSelectedColor = 0xff890c85;
    //tab未选中颜色
    private int textUnselectedColor = 0xff111111;
    //遮罩颜色
    private int maskColor = 0x88888888;
    //tab字体大小
    private int menuTextSize = 14;

    //tab选中图标
    private int menuSelectedIcon;
    //tab未选中图标
    private int menuUnselectedIcon;
    //tab 其他图标
    private int menuOtherIcon;
    private int menuOtherselectedIcon;

    //默认弹窗最大为屏幕高度的比例
    private float menuHeighPercent = 0.5f;
    //默认 tab item 的权重是 1
    private boolean tabItemWeight = true;
    private LayoutParams tablayoutParams;


    public DropDownMenu(Context context) {
        super(context, null);
    }

    public DropDownMenu(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public DropDownMenu(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        setOrientation(VERTICAL);

        //为DropDownMenu添加自定义属性
        int menuBackgroundColor = 0xffffffff;
        int underlineColor = 0xffcccccc;
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DropDownMenu);
        underlineColor = a.getColor(R.styleable.DropDownMenu_ddunderlineColor, underlineColor);
        dividerColor = a.getColor(R.styleable.DropDownMenu_dddividerColor, dividerColor);
        textSelectedColor = a.getColor(R.styleable.DropDownMenu_ddtextSelectedColor, textSelectedColor);
        textUnselectedColor = a.getColor(R.styleable.DropDownMenu_ddtextUnselectedColor, textUnselectedColor);
        menuBackgroundColor = a.getColor(R.styleable.DropDownMenu_ddmenuBackgroundColor, menuBackgroundColor);
        maskColor = a.getColor(R.styleable.DropDownMenu_ddmaskColor, maskColor);
        menuTextSize = a.getDimensionPixelSize(R.styleable.DropDownMenu_ddmenuTextSize, menuTextSize);
        menuSelectedIcon = a.getResourceId(R.styleable.DropDownMenu_ddmenuSelectedIcon, menuSelectedIcon);
        menuUnselectedIcon = a.getResourceId(R.styleable.DropDownMenu_ddmenuUnselectedIcon, menuUnselectedIcon);
        menuOtherIcon = a.getResourceId(R.styleable.DropDownMenu_ddmenuOtherIcon, menuOtherIcon);
        menuOtherselectedIcon = a.getResourceId(R.styleable.DropDownMenu_ddmenuOtherselectedIcon, menuOtherselectedIcon);
        menuHeighPercent = a.getFloat(R.styleable.DropDownMenu_ddmenuMenuHeightPercent, menuHeighPercent);
        a.recycle();

        //初始化tabMenuView并添加到tabMenuView
        tabMenuView = new LinearLayout(context);
        LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        tabMenuView.setOrientation(HORIZONTAL);
        tabMenuView.setGravity(Gravity.CENTER_VERTICAL);
        tabMenuView.setBackgroundColor(menuBackgroundColor);
        tabMenuView.setLayoutParams(params);
        addView(tabMenuView, 0);

        //为tabMenuView添加下划线
        View underLine = new View(getContext());
        underLine.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, dpTpPx(1.0f)));
        underLine.setBackgroundColor(underlineColor);
        addView(underLine, 1);

        //初始化containerView并将其添加到DropDownMenu
        containerView = new FrameLayout(context);
        containerView.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT));
        addView(containerView, 2);

    }

    public int getMenuSize() {
        return tabMenuView != null ? tabMenuView.getChildCount() : 0;
    }

    /**
     * 初始化DropDownMenu
     *
     * @param tabTexts
     * @param popupViews
     * @param contentView
     */
    public void setDropDownMenu(@NonNull List<String> tabTexts, @NonNull List<View> popupViews, @NonNull View contentView) {
        if (tabTexts.size() != popupViews.size()) {
            throw new IllegalArgumentException("params not match, tabTexts.size() should be equal popupViews.size()");
        }
        tabMenuView.removeAllViews();
        containerView.removeAllViews();
        for (int i = 0; i < tabTexts.size(); i++) {
            addTab(tabTexts, i);
        }
        containerView.addView(contentView, 0);

        maskView = new View(getContext());
        maskView.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT));
        maskView.setBackgroundColor(maskColor);
        maskView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                closeMenu();
            }
        });
        containerView.addView(maskView, 1);
        maskView.setVisibility(INVISIBLE);
        if (containerView.getChildAt(2) != null) {
            containerView.removeViewAt(2);
        }

        popupMenuViews = new FrameLayout(getContext());
        popupMenuViews.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, (int) (getScreenSize().y * menuHeighPercent)));
        popupMenuViews.setVisibility(INVISIBLE);
        containerView.addView(popupMenuViews, 2);

        for (int i = 0; i < popupViews.size(); i++) {
            View view = popupViews.get(i);
            view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
            popupMenuViews.addView(view, i);
        }
    }

    private void addTab(@NonNull List<String> tabTexts, int i) {
        if (tabTexts.get(i).equals("")) {
            final LinearLayout tab = new LinearLayout(getContext());
            tab.setGravity(Gravity.CENTER);
            tab.setLayoutParams(getTabLayoutParams());
            tab.setPadding(dpTpPx(5), dpTpPx(12), dpTpPx(5), dpTpPx(12));
            //添加点击事件
            tab.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    switchMenu(tab);
                }
            });
            ImageView img = new ImageView(getContext());
            img.setLayoutParams(new LayoutParams(dpTpPx(12), dpTpPx(15)));
            img.setAdjustViewBounds(true);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                img.setBackground(getResources().getDrawable(menuOtherIcon));
            }
            tab.addView(img);
            tabMenuView.addView(tab);
            //添加分割线
            if (i < tabTexts.size() - 1) {
                View view = new View(getContext());
                view.setLayoutParams(new LayoutParams(dpTpPx(0.0f), ViewGroup.LayoutParams.MATCH_PARENT));
                view.setBackgroundColor(dividerColor);
                tabMenuView.addView(view);
            }
        } else {
            final TextView tab = new TextView(getContext());
            tab.setSingleLine();
            tab.setEllipsize(TextUtils.TruncateAt.END);
            tab.setGravity(Gravity.CENTER);
            tab.setTextSize(TypedValue.COMPLEX_UNIT_PX, menuTextSize);
            tab.setLayoutParams(getTabLayoutParams());
            tab.setTextColor(textUnselectedColor);
            tab.setCompoundDrawablesWithIntrinsicBounds(null, null, getResources().getDrawable(menuUnselectedIcon), null);
            tab.setText(tabTexts.get(i));
            tab.setPadding(dpTpPx(5), dpTpPx(12), dpTpPx(5), dpTpPx(12));
            //添加点击事件
            tab.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    switchMenu(tab);
                }
            });
            tabMenuView.addView(tab);
            //添加分割线
            if (i < tabTexts.size() - 1) {
                View view = new View(getContext());
                view.setLayoutParams(new LayoutParams(dpTpPx(0.0f), ViewGroup.LayoutParams.MATCH_PARENT));
                view.setBackgroundColor(dividerColor);
                tabMenuView.addView(view);
            }
        }
    }

    /**
     * 设置tab item是否平分 或 自适应宽度
     *
     * @param isweight
     */
    public void setTabItemWeight(boolean isweight) {
        tabItemWeight = isweight;
    }


    public void setTabLayoutParams(LayoutParams layoutParams) {
        if (layoutParams != null) {
            tablayoutParams = layoutParams;
        }
    }

    /**
     * 获取 tab item的宽高设置
     *
     * @return
     */
    private LayoutParams getTabLayoutParams() {
        if (tablayoutParams != null) {
            return tablayoutParams;
        } else if (tabItemWeight) {
            tablayoutParams = new LayoutParams(0, ViewGroup.LayoutParams.WRAP_CONTENT, 1.0f);
        } else {
            tablayoutParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        }
        return tablayoutParams;
    }

    /**
     * 改变tab文字
     *
     * @param text
     */
    public void setTabText(String text) {
        if (current_tab_position != -1) {
            ((TextView) tabMenuView.getChildAt(current_tab_position)).setText(text);
        }
    }

    public void setTabClickable(boolean clickable) {
        for (int i = 0; i < tabMenuView.getChildCount(); i = i + 2) {
            tabMenuView.getChildAt(i).setClickable(clickable);
        }
    }

    /**
     * 关闭菜单
     */
    public void closeMenu() {
        if (current_tab_position != -1) {

            if (tabMenuView.getChildAt(current_tab_position) instanceof TextView) {
                ((TextView) tabMenuView.getChildAt(current_tab_position)).setTextColor(textUnselectedColor);
                ((TextView) tabMenuView.getChildAt(current_tab_position)).setCompoundDrawablesWithIntrinsicBounds(null, null,
                        getResources().getDrawable(menuUnselectedIcon), null);
            } else if (tabMenuView.getChildAt(current_tab_position) instanceof LinearLayout) {
                try {
                    LinearLayout layout = (LinearLayout) tabMenuView.getChildAt(current_tab_position);
                    if (layout.getChildAt(0) instanceof ImageView) {
                        ImageView imageView = (ImageView) layout.getChildAt(0);
                        imageView.setBackground(getResources().getDrawable(menuOtherIcon));
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            popupMenuViews.setVisibility(View.INVISIBLE);
            popupMenuViews.setAnimation(AnimationUtils.loadAnimation(getContext(), R.anim.dd_menu_out));
            maskView.setVisibility(INVISIBLE);
            maskView.setAnimation(AnimationUtils.loadAnimation(getContext(), R.anim.dd_mask_out));
            current_tab_position = -1;
        }
    }

    /**
     * DropDownMenu是否处于可见状态
     *
     * @return
     */
    public boolean isShowing() {
        return current_tab_position != -1;
    }

    /**
     * 切换菜单
     *
     * @param target
     */
    private void switchMenu(View target) {
        System.out.println(current_tab_position);
        for (int i = 0; i < tabMenuView.getChildCount(); i = i + 2) {
            if (target == tabMenuView.getChildAt(i)) {
                if (current_tab_position == i) {
                    closeMenu();
                } else {
                    if (current_tab_position == -1) {
                        popupMenuViews.setVisibility(View.VISIBLE);
                        popupMenuViews.setAnimation(AnimationUtils.loadAnimation(getContext(), R.anim.dd_menu_in));
                        maskView.setVisibility(VISIBLE);
                        maskView.setAnimation(AnimationUtils.loadAnimation(getContext(), R.anim.dd_mask_in));
                        popupMenuViews.getChildAt(i / 2).setVisibility(View.VISIBLE);
                        popupMenuViews.invalidate();
                    } else {
                        popupMenuViews.getChildAt(i / 2).setVisibility(View.VISIBLE);
                        popupMenuViews.invalidate();
                    }
                    current_tab_position = i;
                    if (tabMenuView.getChildAt(i) instanceof TextView) {
                        ((TextView) tabMenuView.getChildAt(i)).setTextColor(textSelectedColor);

                        ((TextView) tabMenuView.getChildAt(i)).setCompoundDrawablesWithIntrinsicBounds(null, null,
                                getResources().getDrawable(menuSelectedIcon), null);

                    } else if (tabMenuView.getChildAt(i) instanceof LinearLayout) {
                        try {
                            LinearLayout layout = (LinearLayout) tabMenuView.getChildAt(i);
                            if (layout.getChildAt(0) instanceof ImageView) {
                                ImageView imageView = (ImageView) layout.getChildAt(0);
                                imageView.setBackground(getResources().getDrawable(menuOtherselectedIcon));
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            } else {
                if (tabMenuView.getChildAt(i) instanceof TextView) {
                    ((TextView) tabMenuView.getChildAt(i)).setTextColor(textUnselectedColor);

                    ((TextView) tabMenuView.getChildAt(i)).setCompoundDrawablesWithIntrinsicBounds(null, null,
                            getResources().getDrawable(menuUnselectedIcon), null);

                }
                if (tabMenuView.getChildAt(i) instanceof LinearLayout) {
                    try {
                        LinearLayout layout = (LinearLayout) tabMenuView.getChildAt(i);
                        if (layout.getChildAt(0) instanceof ImageView) {
                            ImageView imageView = (ImageView) layout.getChildAt(0);
                            imageView.setBackground(getResources().getDrawable(menuOtherIcon));
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                popupMenuViews.getChildAt(i / 2).setVisibility(View.INVISIBLE);
            }
        }
    }

    public int dpTpPx(float value) {
        DisplayMetrics dm = getResources().getDisplayMetrics();
        return (int) (TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, dm) + 0.5);
    }

    /**
     * 获取屏幕尺寸
     */
    @SuppressWarnings("deprecation")
    private Point getScreenSize() {
        WindowManager windowManager = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
        Display display = windowManager.getDefaultDisplay();
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR2) {
            return new Point(display.getWidth(), display.getHeight());
        } else {
            Point point = new Point();
            display.getSize(point);
            return point;
        }
    }
}
